﻿// Decompiled with JetBrains decompiler
// Type: Microsoft.InfoCards.HashCryptoSession
// Assembly: infocard, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
// MVID: 8E14765A-6610-409A-BA36-099A0642905D
// Assembly location: E:\git\ALLIDA\windll\infocard.exe

using System;
using System.Diagnostics;
using System.IO;
using System.Security.Cryptography;
using System.Security.Principal;

namespace Microsoft.InfoCards
{
  internal class HashCryptoSession : CryptoSession
  {
    private KeyedHashAlgorithm m_hash;

    public HashCryptoSession(
      Process process,
      DateTime expiration,
      WindowsIdentity identity,
      KeyedHashAlgorithm hash)
      : base(process, expiration, identity, (object) hash, CryptoSession.SessionType.Hash)
    {
      this.m_hash = hash;
    }

    protected override void OnDispose()
    {
      this.m_hash.Clear();
      ((IDisposable) this.m_hash).Dispose();
      this.m_hash = (KeyedHashAlgorithm) null;
    }

    protected override void OnWrite(BinaryWriter bwriter)
    {
      bwriter.Write(this.m_hash.HashSize);
      bwriter.Write(this.m_hash.InputBlockSize);
      bwriter.Write(this.m_hash.OutputBlockSize);
      bwriter.Write(this.m_hash.CanTransformMultipleBlocks);
      bwriter.Write(this.m_hash.CanReuseTransform);
    }

    public void HashCore(byte[] inData)
    {
      this.m_hash.TransformBlock(inData, 0, inData.Length, (byte[]) null, 0);
    }

    public byte[] HashFinal(byte[] inData)
    {
      try
      {
        this.m_hash.TransformFinalBlock(inData, 0, inData.Length);
      }
      finally
      {
        this.m_hash.Initialize();
      }
      return this.m_hash.Hash;
    }
  }
}
